home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 51 / Amiga Format CD51 (2000-03-10)(Future Publishing)(GB)[!][issue 2000-04].iso / -in_the_mag- / workbench / term_4.8 / extras / source / gtlayout-source.lha / LT_GetAttributes.c < prev    next >
C/C++ Source or Header  |  1997-07-06  |  10KB  |  477 lines

  1. /*
  2. **    GadTools layout toolkit
  3. **
  4. **    Copyright © 1993-1997 by Olaf `Olsen' Barthel
  5. **        Freely distributable.
  6. **
  7. **    :ts=4
  8. */
  9.  
  10. #ifndef _GTLAYOUT_GLOBAL_H
  11. #include "gtlayout_global.h"
  12. #endif
  13.  
  14. #include "Assert.h"
  15.  
  16. LONG
  17. LT_GetAttributes(LayoutHandle *Handle,LONG ID,...)
  18. {
  19.     va_list VarArgs;
  20.     LONG    Result;
  21.  
  22.     va_start(VarArgs,ID);
  23.     Result = LT_GetAttributesA(Handle,ID,(struct TagItem *)VarArgs);
  24.     va_end(VarArgs);
  25.  
  26.     return(Result);
  27. }
  28.  
  29.  
  30. /*****************************************************************************/
  31.  
  32.  
  33. /****** gtlayout.library/LT_GetAttributesA ******************************************
  34. *
  35. *   NAME
  36. *    LT_GetAttributesA -- Inquire information on a gadget.
  37. *
  38. *   SYNOPSIS
  39. *    Value = LT_GetAttributesA(Handle,ID,Tags);
  40. *      D0                        A0   D0  A1
  41. *
  42. *    LONG LT_GetAttributesA(LayoutHandle *,LONG ID,struct TagItem *);
  43. *
  44. *    Value = LT_GetAttributes(Handle,ID,...);
  45. *
  46. *    LONG LT_GetAttributes(LayoutHandle *,LONG ID,...);
  47. *
  48. *   FUNCTION
  49. *    All objects created by the user interface layout code posess
  50. *    certain unique properties. The LT_GetAttributes() function will
  51. *    will inquire this information and return it. The implementation
  52. *    differs from gadtools.library/GT_GetGadgetAttrs in that you
  53. *    can inquire only a small subset of the object properties possible
  54. *    via the taglist passed in.
  55. *
  56. *   INPUTS
  57. *    Handle - Pointer to LayoutHandle structure.
  58. *
  59. *    ID - ID number of the object to inquire information about. This
  60. *        is the same value you passed via LA_ID to LT_New() when
  61. *        you created this object.
  62. *
  63. *    Tags - TagItem list to receive information about the object
  64. *        in question.
  65. *
  66. *
  67. *    LA_Left (LONG *) - Left edge of object.
  68. *
  69. *    LA_Top (LONG *) - Top edge of object.
  70. *
  71. *    LA_Width (LONG *) - Width of object.
  72. *
  73. *    LA_Height (LONG *) - Height of object.
  74. *
  75. *    LA_Chars (LONG *) - Width of object measured in character
  76. *        widths. (V9)
  77. *
  78. *    LA_Lines (LONG *) - Height of object measured in character
  79. *        heights. (V9)
  80. *
  81. *    LA_LabelLeft (LONG *) - Left edge of label text. (V9)
  82. *
  83. *    LA_LabelTop (LONG *) - Top edge of label text. (V9)
  84. *
  85. *    LABO_Object (Object *) - Returns a pointer to the BOOPSI object
  86. *        the BOOPSI_KIND object is based upon. (V10)
  87. *
  88. *            NOTE: Don't unlink the object or dispose of it or
  89. *                terrible things are bound to happen.
  90. *
  91. *    LAST_CursorPosition (LONG *) - Current position of the cursor
  92. *        in STRING_KIND and FRACTION_KIND objects. (V
  93. *
  94. *   RESULT
  95. *    The result depends on the object type:
  96. *
  97. *        VERTICAL_KIND:
  98. *        HORIZONTAL_KIND:
  99. *
  100. *            active page
  101. *
  102. *        SCROLLER_KIND:
  103. *
  104. *            current GTSC_Top value
  105. *
  106. *        TAPEDECK_KIND:
  107. *
  108. *            current LATD_Pressed value
  109. *
  110. *        LEVEL_KIND:
  111. *
  112. *            current LAVL_Level state
  113. *
  114. *        CHECKBOX_KIND:
  115. *
  116. *            current GTCB_Checked state
  117. *
  118. *        LISTVIEW_KIND:
  119. *
  120. *            current GTLV_Selected state
  121. *
  122. *        MX_KIND:
  123. *
  124. *            current GTMX_Active state
  125. *
  126. *        CYCLE_KIND:
  127. *
  128. *            current GTCY_Active state
  129. *
  130. *        POPUP_KIND:
  131. *
  132. *            current LAPU_Active state
  133. *
  134. *        TAB_KIND:
  135. *
  136. *            current LATB_Active state
  137. *
  138. *        PALETTE_KIND:
  139. *
  140. *            current GTPA_Color state
  141. *
  142. *        SLIDER_KIND:
  143. *
  144. *            current GTSL_Level state
  145. *
  146. *        GAUGE_KIND:
  147. *
  148. *            current LAGA_Percent state
  149. *
  150. *        STRING_KIND:
  151. *
  152. *            pointer to current string
  153. *
  154. *        PASSWORD_KIND:
  155. *
  156. *            pointer to current string
  157. *
  158. *        INTEGER_KIND:
  159. *
  160. *            number currently entered
  161. *
  162. *        BOOPSI_KIND:
  163. *
  164. *            whatever the object thinks is its
  165. *            current value
  166. *
  167. ******************************************************************************
  168. *
  169. */
  170.  
  171. LONG LIBENT
  172. LT_GetAttributesA(REG(a0) LayoutHandle *Handle,REG(d0) LONG ID,REG(a1) struct TagItem *TagList)
  173. {
  174.     if(Handle)
  175.     {
  176.         struct TagItem    *ThisTag;
  177.         ObjectNode        *Node = NULL;
  178.  
  179.         if(ThisTag = FindTagItem(LAPR_Gadget,TagList))
  180.             Node = ((struct Gadget *)ThisTag->ti_Data)->UserData;
  181.  
  182.         if(!Node)
  183.         {
  184.             if(ThisTag = FindTagItem(LAPR_Object,TagList))
  185.                 Node = (ObjectNode *)ThisTag->ti_Data;
  186.         }
  187.  
  188.         if(!Node)
  189.             Node = LTP_FindNode(Handle,ID);
  190.  
  191.         if(Node)
  192.         {
  193.             struct Gadget *Gadget = Node->Host;
  194.  
  195.             if(TagList)
  196.             {
  197.                 struct TagItem    *TagItem,
  198.                                 *TempPtr = TagList;
  199.                 LONG            *Value;
  200.  
  201.                 while(TagItem = NextTagItem(&TempPtr))
  202.                 {
  203.                     Value = (LONG *)TagItem->ti_Data;
  204.  
  205.                     switch(TagItem->ti_Tag)
  206.                     {
  207.                         case LA_Left:
  208.  
  209.                             if(Node->Type == FRAME_KIND && Node->Special.Frame.DrawBox)
  210.                                 *Value = Node->Left + 4;
  211.                             else
  212.                                 *Value = Node->Left;
  213.  
  214.                             break;
  215.  
  216.                         case LA_Top:
  217.  
  218.                             if(Node->Type == FRAME_KIND && Node->Special.Frame.DrawBox)
  219.                                 *Value = Node->Top + 2;
  220.                             else
  221.                                 *Value = Node->Top;
  222.  
  223.                             break;
  224.  
  225.                         case LA_Width:
  226.  
  227.                             if(Node->Type == FRAME_KIND && Node->Special.Frame.DrawBox)
  228.                                 *Value = Node->Width - 8;
  229.                             else
  230.                                 *Value = Node->Width;
  231.  
  232.                             break;
  233.  
  234.                         case LA_Height:
  235.  
  236.                             if(Node->Type == FRAME_KIND && Node->Special.Frame.DrawBox)
  237.                                 *Value = Node->Height - 4;
  238.                             else
  239.                                 *Value = Node->Height;
  240.  
  241.                             break;
  242.  
  243.                         case LAST_CursorPosition:
  244.  
  245.                             *Value = 0;
  246.  
  247.                             if(Node->Type == STRING_KIND || Node->Type == FRACTION_KIND)
  248.                             {
  249.                                 if(Gadget != NULL)
  250.                                 {
  251.                                     struct StringInfo *StringInfo = Gadget->SpecialInfo;
  252.  
  253.                                     *Value = StringInfo->BufferPos;
  254.                                 }
  255.                             }
  256.  
  257.                             break;
  258.  
  259. #ifdef DO_BOOPSI_KIND
  260.                         case LABO_Object:
  261.  
  262.                             if(Node->Type == BOOPSI_KIND)
  263.                                 *Value = (LONG)Node->Host;
  264.                             else
  265.                                 *Value = NULL;
  266.  
  267.                             break;
  268. #endif    /* DO_BOOPSI_KIND */
  269.                         case LA_Chars:
  270.  
  271.                             *Value = Node->Chars;
  272.                             break;
  273.  
  274.                         case LA_Lines:
  275.  
  276.                             *Value = Node->Lines;
  277.                             break;
  278.  
  279.                         case LA_LabelLeft:
  280.  
  281.                             switch(Node->LabelPlace)
  282.                             {
  283.                                 case PLACE_LEFT:
  284.  
  285.                                     *Value    = Node->Left - (INTERWIDTH + Node->LabelWidth);
  286.                                     break;
  287.  
  288.                                 case PLACE_RIGHT:
  289.  
  290.                                     *Value    = Node->Left + Node->Width + INTERWIDTH;
  291.                                     break;
  292.  
  293.                                 case PLACE_ABOVE:
  294.  
  295.                                     *Value    = Node->Left + (Node->Width - Node->LabelWidth) / 2;
  296.                                     break;
  297.  
  298.                                 case PLACE_BELOW:
  299.  
  300.                                     *Value    = Node->Left + (Node->Width - Node->LabelWidth) / 2;
  301.                                     break;
  302.  
  303.                                 case PLACE_IN:
  304.  
  305.                                     *Value    = Node->Left + (Node->Width - Node->LabelWidth) / 2;
  306.                                     break;
  307.                             }
  308.  
  309.                             break;
  310.  
  311.                         case LA_LabelTop:
  312.  
  313.                             switch(Node->LabelPlace)
  314.                             {
  315.                                 case PLACE_LEFT:
  316.  
  317.                                     *Value    = Node->Top + (Node->Height - Handle->GlyphHeight) / 2;
  318.                                     break;
  319.  
  320.                                 case PLACE_RIGHT:
  321.  
  322.                                     *Value    = Node->Top + (Node->Height - Handle->GlyphHeight) / 2;
  323.                                     break;
  324.  
  325.                                 case PLACE_ABOVE:
  326.  
  327.                                     *Value    = Node->Top - (Handle->GlyphHeight + INTERHEIGHT);
  328.                                     break;
  329.  
  330.                                 case PLACE_BELOW:
  331.  
  332.                                     *Value    = Node->Top + Node->Height + INTERHEIGHT;
  333.                                     break;
  334.  
  335.                                 case PLACE_IN:
  336.  
  337.                                     *Value    = Node->Top + (Node->Height - Handle->GlyphHeight) / 2;
  338.                                     break;
  339.                             }
  340.  
  341.                             break;
  342.                     }
  343.                 }
  344.             }
  345.  
  346.             switch(Node->Type)
  347.             {
  348.                 case CHECKBOX_KIND:
  349.                 case LISTVIEW_KIND:
  350.                 case MX_KIND:
  351.                 case CYCLE_KIND:
  352.                 case PALETTE_KIND:
  353.                 case SLIDER_KIND:
  354.                 case SCROLLER_KIND:
  355. #if defined(DO_POPUP_KIND) && defined(DO_BOOPSI_KIND)
  356.                 case POPUP_KIND:
  357. #endif
  358. #if defined(DO_TAB_KIND) && defined(DO_BOOPSI_KIND)
  359.                 case TAB_KIND:
  360. #endif
  361. #ifdef DO_GAUGE_KIND
  362.                 case GAUGE_KIND:
  363. #endif
  364. #ifdef DO_TAPEDECK_KIND
  365.                 case TAPEDECK_KIND:
  366. #endif    /* DO_TAPEDECK_KIND */
  367.                     return(Node->Current);
  368. #ifdef DO_BOOPSI_KIND
  369.                 case BOOPSI_KIND:
  370.                 {
  371.                     ULONG Storage;
  372.  
  373.                     if(Gadget && GetAttr(Node->Special.BOOPSI.TagCurrent,Gadget,&Storage))
  374.                         return((LONG)Storage);
  375.                     else
  376.                         return(NULL);
  377.                 }
  378. #endif    /* DO_BOOPSI_KIND */
  379.  
  380.                 case VERTICAL_KIND:
  381.                 case HORIZONTAL_KIND:
  382.  
  383.                     return((LONG)Node->Special.Group.ActivePage);
  384.  
  385. #ifdef DO_LEVEL_KIND
  386.                 case LEVEL_KIND:
  387.  
  388.                     return(Node->Current);
  389. #endif    /* DO_LEVEL_KIND */
  390.                 case STRING_KIND:
  391.                 case FRACTION_KIND:
  392.  
  393.                     if(Gadget)
  394.                     {
  395.                         if(Node->Type == FRACTION_KIND)
  396.                         {
  397.                             LTP_CopyFraction(Node->Special.String.RealString,((struct StringInfo *)Gadget->SpecialInfo)->Buffer);
  398.  
  399.                             return((LONG)Node->Special.String.RealString);
  400.                         }
  401.                         else
  402.                         {
  403.                             struct StringInfo *StringInfo;
  404.  
  405.                             StringInfo = (struct StringInfo *)Gadget->SpecialInfo;
  406.  
  407.                             return((LONG)StringInfo->Buffer);
  408.                         }
  409.                     }
  410.                     else
  411.                     {
  412.                         STRPTR String = Node->Special.String.String;
  413.  
  414.                         if(!String)
  415.                             String = "";
  416.  
  417.                         if(Node->Type == FRACTION_KIND)
  418.                         {
  419.                             LTP_CopyFraction(Node->Special.String.RealString,String);
  420.  
  421.                             String = Node->Special.String.RealString;
  422.                         }
  423.  
  424.                         return((LONG)String);
  425.                     }
  426.  
  427.                     break;
  428.  
  429. #ifdef DO_PASSWORD_KIND
  430.                 case PASSWORD_KIND:
  431.  
  432.                     return((LONG)Node->Special.String.RealString);
  433. #endif
  434.  
  435.                 case INTEGER_KIND:
  436.  
  437.                     if(Gadget)
  438.                     {
  439.                         struct StringInfo    *StringInfo;
  440.                         LONG                 Contents;
  441.  
  442.                         StringInfo = (struct StringInfo *)Gadget->SpecialInfo;
  443.  
  444.                         Contents = StringInfo->LongInt;
  445.  
  446.                         if(Contents < Node->Min)
  447.                             Contents = Node->Min;
  448.                         else
  449.                         {
  450.                             if(Contents > Node->Max)
  451.                                 Contents = Node->Max;
  452.                         }
  453.  
  454.                         LT_SetAttributes(Handle,0,
  455.                             LAPR_Object,    Node,
  456.                             GTIN_Number,    Contents,
  457.                         TAG_DONE);
  458.  
  459.                         return(Node->Special.Integer.Number = Contents);
  460.                     }
  461.                     else
  462.                         return(Node->Special.Integer.Number);
  463.  
  464.                     break;
  465.  
  466.                 case GROUP_KIND:
  467.  
  468.                     return((LONG)Node->Special.Group.ActivePage);
  469.             }
  470.         }
  471.         else
  472.             return((LONG)Handle->UserData);
  473.     }
  474.  
  475.     return(NULL);
  476. }
  477.